/*-------------------------------------------------------------------------
 *
 * proclist_types.h
 *		pgprocnos 的双向链表
 *
 * 请参见 proclist.h 了解对这些类型操作的函数。
 *
 * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *		src/include/storage/proclist_types.h
 *-------------------------------------------------------------------------
 */

#ifndef PROCLIST_TYPES_H
#define PROCLIST_TYPES_H

/*
 * 进程的双向链表中的一个节点。链接字段包含下一个和上一个进程的
 * 基于0的 PGPROC 索引，或者在最后一个节点的下一个链接和第一个节点的
 * 上一个链接中使用 INVALID_PGPROCNO。当前不在任何列表中的节点
 * 应该具有 next == prev == 0；这对于在列表中的节点来说不是一个
 * 可能的状态，因为我们不允许循环。
 */
typedef struct proclist_node
{
	int			next;			/* 下一个 PGPROC 的 pgprocno */
	int			prev;			/* 上一个 PGPROC 的 pgprocno */
} proclist_node;

/*
 * PGPROCs 的双向链表的头部，通过 pgprocno 进行标识。
 * 空列表由 head == tail == INVALID_PGPROCNO 表示。
 */
typedef struct proclist_head
{
	int			head;			/* 头部 PGPROC 的 pgprocno */
	int			tail;			/* 尾部 PGPROC 的 pgprocno */
} proclist_head;

/*
 * 允许在迭代时进行一些修改的列表迭代器。
 */
typedef struct proclist_mutable_iter
{
	int			cur;			/* 当前 PGPROC 的 pgprocno */
	int			next;			/* 下一个 PGPROC 的 pgprocno */
} proclist_mutable_iter;

#endif							/* PROCLIST_TYPES_H */
